package com.luxsoft.siipap.service.tesoreria;


import java.util.List;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.luxsoft.siipap.dao.tesoreria.CargoAbonoDao;
import com.luxsoft.siipap.dao.tesoreria.RequisicionDao;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.model.gastos.GFacturaPorCompra;
import com.luxsoft.siipap.model.gastos.GProveedor;
import com.luxsoft.siipap.model.tesoreria.CargoAbono;
import com.luxsoft.siipap.model.tesoreria.Requisicion;
import com.luxsoft.siipap.model.tesoreria.RequisicionDe;
import com.luxsoft.siipap.model.tesoreria.Requisicion.Estado;
import com.luxsoft.siipap.service.impl.GenericManagerImpl;

public class RequisicionesManagerImpl extends GenericManagerImpl<Requisicion, Long> implements RequisicionesManager{
	
	//private ComprasDeGastosManager comprasDeGastosManager;
	
	private CargoAbonoDao cargoAbonoDao;

	public RequisicionesManagerImpl(RequisicionDao dao) {
		super(dao);
	}
	
	private RequisicionDao getRequisicionDao(){
		return (RequisicionDao)genericDao;
	}

	@Transactional(propagation=Propagation.REQUIRED)
	public Requisicion save(Requisicion req) {
		if(req.getId()==null)			
			req.actualizarTotal();
		for(RequisicionDe det:req.getPartidas()){
			GFacturaPorCompra fac=det.getFacturaDeGasto();
			if(fac!=null){
				
			}
		}
		for(RequisicionDe det:req.getPartidas()){
			//det.getFacturaDeCompras();
			//System.out.println("DF en Fac de CXP: "+det.getFacturaDeCompras().getDescuentoFinanciero());
		}
		return super.save(req);
	}

	@Transactional(propagation=Propagation.REQUIRED)
	public Requisicion registrarPago(Requisicion req) {
		
		req.setEstado(Estado.PAGADA);
		return save(req);
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	public Requisicion cancelarPago(Requisicion req) {
		
		if(req.getPago()!=null){
			//Long pagoId=req.getPago().getId();
			req=get(req.getId());
			CargoAbono ca=req.getPago();
			ca.cancelar();
			ca.setComentario("CANCELADO REQ:"+req.getId());
			ca.setAFavor("(CH) CANCELADO ");
			getCargoAbonoDao().save(ca);
			//getCargoAbonoDao().remove(pagoId);
			req.cancelarPago();
		}
		
		return save(req);
	}
	
	
	

	@Transactional(propagation=Propagation.REQUIRED)
	public void eliminarRequisicionAutomatica(Long  id) {
		Requisicion req=get(id);
		//Verificar si existen facturas relacionadas con las partidas de esta requisicion
		for(RequisicionDe det:req.getPartidas()){			
			//getRequisicionDao().cancleraFacturaRequisitada(det);
		}
		remove(id);
	}

	public List<Requisicion> buscarRequisicionesDeGastos() {
		return getRequisicionDao().buscarRequisicionesDeGastos();
	}
	
	public List<Requisicion> buscarRequisicionesDeGastos(Periodo p){
		return getRequisicionDao().buscarRequisicionesDeGastos(p);
	}
	
	/**
	 * Regresa una lista de las requisiciones elaboradas en el modulo de compras
	 * en el periodo indicado
	 * 
	 * @param p
	 * @return
	 */
	public List<Requisicion> buscarRequisicionesDeCompras(Periodo p){
		return getRequisicionDao().buscarRequisicionesDeCompras(p);
	}
	

	public Requisicion buscarRequisicionDeCompras(Long id) {		
		return getRequisicionDao().buscarRequisicionDeCompras(id);
	}

	/**
	 * @return the cargoAbonoDao
	 */
	public CargoAbonoDao getCargoAbonoDao() {
		return cargoAbonoDao;
	}

	/**
	 * @param cargoAbonoDao the cargoAbonoDao to set
	 */
	public void setCargoAbonoDao(CargoAbonoDao cargoAbonoDao) {
		this.cargoAbonoDao = cargoAbonoDao;
	}

	public long nextCheque(final Long cuentaId) {
		return getCargoAbonoDao().buscarProximoCheque(cuentaId);
	}

	public List<RequisicionDe> buscarAnticiposPendientes(final GProveedor prov) {
		return getRequisicionDao().buscarAnticiposDisponibles(prov);
	}

	

	

}
